home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / varie / uae-0_64.lha / uae-0.6.4 / src / expansion.c < prev    next >
C/C++ Source or Header  |  1996-09-02  |  14KB  |  527 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   *  Expansion Slots
  5.   *
  6.   * (c) 1996 Stefan Reinauer
  7.   */
  8.  
  9. #include "sysconfig.h"
  10. #include "sysdeps.h"
  11.  
  12. #include "config.h"
  13. #include "options.h"
  14. #include "memory.h"
  15. #include "custom.h"
  16. #include "newcpu.h"
  17. #include "autoconf.h"
  18.  
  19. #define MAX_EXPANSION_BOARDS 5
  20.  
  21. /* 00 / 02 */
  22.  
  23. #define MEM_8MB    0x00        /* Size of Memory Block           */
  24. #define MEM_4MB    0x07
  25. #define MEM_2MB    0x06
  26. #define MEM_1MB    0x05
  27. #define MEM_512KB  0x04
  28. #define MEM_256KB  0x03
  29. #define MEM_128KB  0x02
  30. #define MEM_64KB   0x01
  31.  
  32. #define same_slot  0x08     /* Next card is in the same Slot  */
  33. #define rom_card   0x10     /* Card has valid ROM             */
  34. #define add_memory 0x20     /* Add Memory to List of Free Ram */
  35.  
  36. #define generic    0xc0     /* Type of Expansion Card         */
  37. #define future1    0x00
  38. #define future2    0x40
  39. #define future3    0x80
  40.  
  41. /* ********************************************************** */
  42.  
  43. /* Card Data - Where can I get a complete List of these ????  */
  44.  
  45. /* 04 - 06 & 10-16 */
  46. #define commodore_g   513  /* Commodore Braunschweig (Germany) */
  47. #define commodore     514  /* Commodore West Chester           */
  48. #define gvp         2017  /* GVP */
  49. #define hackers_id   2011
  50.  
  51. #define   commodore_a2091         3  /* A2091 / A590 Card from C=   */
  52. #define   commodore_a2091_ram    10  /* A2091 / A590 Ram on HD-Card */
  53. #define   commodore_a2232        70  /* A2232 Multiport Expansion   */
  54.  
  55. #define   gvp_series_2_scsi      11
  56. #define   gvp_iv_24_gfx          32
  57.  
  58. /* ********************************************************** */
  59. /* 08-0A */
  60.  
  61. #define no_shutup  64  /* Card cannot receive Shut_up_forever */
  62. #define care_addr 128  /* Adress HAS to be $200000-$9fffff    */
  63.  
  64. /* ********************************************************** */
  65.  
  66. /* 40-42 */
  67. #define enable_irq   1  /* enable Interrupt                   */ 
  68. #define reset_card   4  /* Reset of Expansion Card            */
  69. #define card_int2   16  /* READ ONLY: IRQ 2 occured           */
  70. #define card_irq6   32  /* READ ONLY: IRQ 6 occured           */
  71. #define card_irq7   64  /* READ ONLY: IRQ 7 occured           */
  72. #define does_irq   128  /* READ ONLY: Karte loest ger. IRQ aus*/
  73.  
  74. /* ********************************************************** */
  75.  
  76. /* ROM defines */
  77.  
  78. #define rom_4bit    (0x00<<14) /* ROM width */
  79. #define rom_8bit    (0x01<<14)
  80. #define rom_16bit   (0x02<<14)
  81.  
  82. #define rom_never   (0x00<<12) /* Never run Boot Code       */
  83. #define rom_install (0x01<<12) /* run code at install time  */
  84. #define rom_binddrv (0x02<<12) /* run code with binddrivers */
  85.  
  86. CPTR ROM_filesys_resname = 0, ROM_filesys_resid = 0;
  87. CPTR ROM_filesys_diagentry = 0;
  88. CPTR ROM_hardfile_resname = 0, ROM_hardfile_resid = 0;
  89. CPTR ROM_hardfile_init = 0;
  90.  
  91. /* ********************************************************** */
  92.  
  93. static void expamem_init_clear(void);
  94. static void expamem_map_clear(void);
  95. static void expamem_init_fastcard(void);
  96. static void expamem_map_fastcard(void);
  97. static void expamem_init_filesys(void);
  98. static void expamem_map_filesys(void);
  99.  
  100. void (*card_init[MAX_EXPANSION_BOARDS])(void);
  101. void (*card_map[MAX_EXPANSION_BOARDS])(void);
  102.  
  103. int ecard = 0;
  104.  
  105. /* **********************************************************
  106.  *  Fast Memory
  107.  * ********************************************************** */
  108.  
  109. static ULONG fastmem_mask;
  110.  
  111. static ULONG fastmem_alget(CPTR) REGPARAM;
  112. static UWORD fastmem_awget(CPTR) REGPARAM;
  113. static ULONG fastmem_lget(CPTR) REGPARAM;
  114. static UWORD fastmem_wget(CPTR) REGPARAM;
  115. static UBYTE fastmem_bget(CPTR) REGPARAM;
  116. static void  fastmem_lput(CPTR, ULONG) REGPARAM;
  117. static void  fastmem_wput(CPTR, UWORD) REGPARAM;
  118. static void  fastmem_bput(CPTR, UBYTE) REGPARAM;
  119. static int   fastmem_check(CPTR addr, ULONG size) REGPARAM;
  120. static UBYTE *fastmem_xlate(CPTR addr) REGPARAM;
  121.  
  122. static ULONG fastmem_start; /* Determined by the OS */
  123. static UBYTE *fastmemory = NULL;
  124.  
  125. ULONG fastmem_alget(CPTR addr)
  126. {
  127.     UBYTE *m;
  128.     addr -= fastmem_start & fastmem_mask;
  129.     addr &= fastmem_mask;
  130.     m = fastmemory + addr;
  131.     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
  132.         + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
  133. }
  134.  
  135. UWORD fastmem_awget(CPTR addr)
  136. {
  137.     UBYTE *m;
  138.     addr -= fastmem_start & fastmem_mask;
  139.     addr &= fastmem_mask;
  140.     m = fastmemory + addr;
  141.     return ((UWORD)m[0] << 8) + m[1];
  142. }
  143.  
  144. ULONG fastmem_lget(CPTR addr)
  145. {
  146.     UBYTE *m;
  147.     addr -= fastmem_start & fastmem_mask;
  148.     addr &= fastmem_mask;
  149.     m = fastmemory + addr;
  150.     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
  151.         + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
  152. }
  153.  
  154. UWORD fastmem_wget(CPTR addr)
  155. {
  156.     UBYTE *m;
  157.     addr -= fastmem_start & fastmem_mask;
  158.     addr &= fastmem_mask;
  159.     m = fastmemory + addr;
  160.     return ((UWORD)m[0] << 8) + m[1];
  161. }
  162.  
  163. UBYTE fastmem_bget(CPTR addr)
  164. {
  165.     addr -= fastmem_start & fastmem_mask;
  166.     addr &= fastmem_mask;
  167.     return fastmemory[addr];
  168. }
  169.  
  170. void fastmem_lput(CPTR addr, ULONG l)
  171. {
  172.     UBYTE *m;
  173.     addr -= fastmem_start & fastmem_mask;
  174.     addr &= fastmem_mask;
  175.     m = fastmemory + addr;
  176.     m[0] = l >> 24;
  177.     m[1] = l >> 16;
  178.     m[2] = l >> 8;
  179.     m[3] = l;
  180. }
  181.  
  182. void fastmem_wput(CPTR addr, UWORD w)
  183. {
  184.     UBYTE *m;
  185.     addr -= fastmem_start & fastmem_mask;
  186.     addr &= fastmem_mask;
  187.     m = fastmemory + addr;
  188.     m[0] = w >> 8;
  189.     m[1] = w;
  190. }
  191.  
  192. void fastmem_bput(CPTR addr, UBYTE b)
  193. {
  194.     addr -= fastmem_start & fastmem_mask;
  195.     addr &= fastmem_mask;
  196.     fastmemory[addr] = b;
  197. }
  198.  
  199. static int fastmem_check(CPTR addr, ULONG size)
  200. {
  201.     addr -= fastmem_start & fastmem_mask;
  202.     addr &= fastmem_mask;
  203.     return (addr + size) < fastmem_size;
  204. }
  205.  
  206. static UBYTE *fastmem_xlate(CPTR addr)
  207. {
  208.     addr -= fastmem_start & fastmem_mask;
  209.     addr &= fastmem_mask;
  210.     return fastmemory + addr;
  211. }
  212.  
  213. addrbank fastmem_bank = {
  214.     fastmem_alget, fastmem_awget,
  215.     fastmem_lget, fastmem_wget, fastmem_bget,
  216.     fastmem_lput, fastmem_wput, fastmem_bput,
  217.     fastmem_xlate, fastmem_check
  218. };
  219.  
  220.  
  221. /*
  222.  * Filesystem device ROM
  223.  * This is very simple, the Amiga shouldn't be doing things with it. No support
  224.  * for 68020 unaligned addressing etc.
  225.  */
  226.  
  227. static ULONG filesys_lget(CPTR) REGPARAM;
  228. static UWORD filesys_wget(CPTR) REGPARAM;
  229. static UBYTE filesys_bget(CPTR) REGPARAM;
  230. static void  filesys_lput(CPTR, ULONG) REGPARAM;
  231. static void  filesys_wput(CPTR, UWORD) REGPARAM;
  232. static void  filesys_bput(CPTR, UBYTE) REGPARAM;
  233.  
  234. static ULONG filesys_start; /* Determined by the OS */
  235. static UBYTE filesysory[65536];
  236.  
  237. ULONG filesys_lget(CPTR addr)
  238. {
  239.     UBYTE *m;
  240.     addr -= filesys_start & 65535;
  241.     addr &= 65535;
  242.     m = filesysory + addr;
  243.     return (((ULONG)m[0] << 24) + ((ULONG)m[1] << 16) 
  244.         + ((ULONG)m[2] << 8) + ((ULONG)m[3]));
  245. }
  246.  
  247. UWORD filesys_wget(CPTR addr)
  248. {
  249.     UBYTE *m;
  250.     addr -= filesys_start & 65535;
  251.     addr &= 65535;
  252.     m = filesysory + addr;
  253.     return ((UWORD)m[0] << 8) + m[1];
  254. }
  255.  
  256. UBYTE filesys_bget(CPTR addr)
  257. {
  258.     addr -= filesys_start & 65535;
  259.     addr &= 65535;
  260.     return filesysory[addr];
  261. }
  262.  
  263. static void filesys_lput(CPTR addr, ULONG l)
  264. {
  265.     fprintf(stderr, "filesys_lput called\n");
  266. }
  267.  
  268. static void filesys_wput(CPTR addr, UWORD w)
  269. {
  270.     fprintf(stderr, "filesys_wput called\n");
  271. }
  272.  
  273. static void filesys_bput(CPTR addr, UBYTE b)
  274. {
  275.     fprintf(stderr, "filesys_bput called\n");
  276. }
  277.  
  278. addrbank filesys_bank = {
  279.     default_alget, default_awget,
  280.     filesys_lget, filesys_wget, filesys_bget,
  281.     filesys_lput, filesys_wput, filesys_bput,
  282.     default_xlate, default_check
  283. };
  284.  
  285.  
  286. /* ******************************************************* */
  287.  
  288. /* Autoconfig address space at 0xE80000 */
  289. static UBYTE expamem[65536];
  290.  
  291. static UBYTE expamem_lo;
  292. static UBYTE expamem_hi;
  293.  
  294. static ULONG expamem_lget(CPTR) REGPARAM;
  295. static UWORD expamem_wget(CPTR) REGPARAM;
  296. static UBYTE expamem_bget(CPTR) REGPARAM;
  297. static void  expamem_lput(CPTR, ULONG) REGPARAM;
  298. static void  expamem_wput(CPTR, UWORD) REGPARAM;
  299. static void  expamem_bput(CPTR, UBYTE) REGPARAM;
  300.  
  301. addrbank expamem_bank = {
  302.     expamem_lget, expamem_wget,
  303.     expamem_lget, expamem_wget, expamem_bget,
  304.     expamem_lput, expamem_wput, expamem_bput,
  305.     default_xlate, default_check
  306. };
  307.  
  308. static ULONG expamem_lget(CPTR addr)
  309. {
  310.     fprintf(stderr,"warning: READ.L from address $%lx \n",addr);
  311.     return 0xffffffff;
  312. }
  313.  
  314. static UWORD expamem_wget(CPTR addr)
  315. {
  316.     fprintf(stderr,"warning: READ.W from address $%lx \n",addr);
  317.     return 0xffff;
  318. }
  319.  
  320. static UBYTE expamem_bget(CPTR addr)
  321. {
  322.     UBYTE value;
  323.     addr &= 0xFFFF;
  324.     return expamem[addr];
  325. }
  326.  
  327. static void  expamem_write(CPTR addr, UBYTE value)
  328. {
  329.     addr &= 0xffff;
  330.     if (addr==00 || addr==02 || addr==0x40 || addr==0x42) {
  331.     expamem[addr] = (value & 0xf0);
  332.     expamem[addr+2] = (value & 0x0f) << 4;
  333.     } else {
  334.     expamem[addr] = ~(value & 0xf0);
  335.     expamem[addr+2] = ~((value & 0x0f) << 4);
  336.     }
  337. }
  338.  
  339. static void expamem_lput(CPTR addr, ULONG value)
  340. {
  341.     fprintf(stderr,"warning: WRITE.L to address $%lx : value $%lx\n",addr,value);
  342. }
  343.  
  344. static void expamem_wput(CPTR addr, UWORD value)
  345. {
  346.     fprintf(stderr,"warning: WRITE.W to address $%lx : value $%x\n",addr,value);
  347. }
  348.  
  349. static void expamem_bput(CPTR addr, UBYTE value)
  350. {
  351.     switch (addr&0xff) {
  352.      case 0x30:
  353.      case 0x32:
  354.     expamem_hi = 0;
  355.     expamem_lo = 0;
  356.     expamem_write (0x48, 0x00);
  357.     break;
  358.  
  359.      case 0x48:    
  360.     expamem_hi = value;
  361.         (*card_map[ecard])();
  362.         fprintf (stderr,"   Card %d done.\n",ecard+1);
  363.         ++ecard;
  364.         if (ecard <= MAX_EXPANSION_BOARDS)
  365.         (*card_init[ecard])();
  366.     else
  367.         expamem_init_clear();
  368.            break;
  369.     
  370.      case 0x4a:    
  371.     expamem_lo = value;
  372.     break;
  373.     
  374.      case 0x4c:
  375.         fprintf (stderr,"   Card %d had no success.\n",ecard+1);
  376.         ++ecard;
  377.         if (ecard <= MAX_EXPANSION_BOARDS) 
  378.         (*card_init[ecard])();
  379.     else  
  380.         expamem_init_clear();
  381.         break;
  382.     }
  383. }
  384.  
  385. void expamem_reset()
  386. {
  387.     int cardno = 0;
  388.  
  389.     ecard = 0;
  390.     
  391.     if (fastmemory != NULL) {
  392.     card_init[cardno] = expamem_init_fastcard;
  393.     card_map[cardno++] = expamem_map_fastcard;
  394.     }
  395.  
  396.     if (automount_uaedev && !ersatzkickfile) {
  397.     card_init[cardno] = expamem_init_filesys;
  398.     card_map[cardno++] = expamem_map_filesys;
  399.     }
  400.  
  401.     while (cardno < MAX_EXPANSION_BOARDS) {
  402.     card_init[cardno] = expamem_init_clear;
  403.     card_map[cardno++] = expamem_map_clear;
  404.     }
  405.     
  406.     (*card_init[0])();
  407. }
  408.  
  409. void expansion_init(void)
  410. {
  411.     if (fastmem_size > 0) {
  412.     fastmem_mask = fastmem_size - 1;
  413.     fastmemory = (UBYTE *)calloc(fastmem_size,1);
  414.     if (fastmemory == NULL) {
  415.         fprintf (stderr,"Out of memory for fastmem card.\n");
  416.     }
  417.     }
  418. }
  419.  
  420. /* ***************************************************************
  421.  *     Expansion Card (ZORRO II) for 1/2/4/8 MB of Fast Memory
  422.  * *************************************************************** */
  423.  
  424. void expamem_map_fastcard()
  425. {
  426.     fastmem_start = ((expamem_hi|(expamem_lo>>4)) << 16);
  427.     map_banks (&fastmem_bank, fastmem_start >> 16, fastmem_size >> 16);
  428.     fprintf (stderr,"Fastcard: mapped @$%lx: %dMB fast memory\n",fastmem_start, fastmem_size >>20);
  429. }
  430.  
  431. void expamem_init_fastcard()
  432. {
  433.     expamem_init_clear();
  434.     if (fastmem_size==0x100000)
  435.     expamem_write (0x00, MEM_1MB+add_memory+generic);
  436.     else if (fastmem_size==0x200000)
  437.     expamem_write (0x00, MEM_2MB+add_memory+generic);
  438.     else if (fastmem_size==0x400000)
  439.     expamem_write (0x00, MEM_4MB+add_memory+generic);
  440.     else if (fastmem_size==0x800000)
  441.     expamem_write (0x00, MEM_8MB+add_memory+generic);
  442.  
  443.     expamem_write (0x08, care_addr);
  444.  
  445.     expamem_write (0x04, 1);
  446.     expamem_write (0x10, hackers_id >> 8);
  447.     expamem_write (0x14, hackers_id & 0x0f);
  448.  
  449.     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
  450.     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
  451.     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
  452.     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
  453.  
  454.     expamem_write (0x28, 0x00); /* Rom-Offset hi  */
  455.     expamem_write (0x2c, 0x00); /* ROM-Offset lo  */
  456.  
  457.     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
  458. }
  459.  
  460. /* 
  461.  * Filesystem device
  462.  */
  463.  
  464. void expamem_map_filesys()
  465. {
  466.     filesys_start=((expamem_hi | (expamem_lo >> 4)) << 16);
  467.     map_banks(&filesys_bank, filesys_start >> 16, 1);
  468. }
  469.  
  470. void expamem_init_filesys()
  471. {
  472.     UBYTE diagarea[] = { 0x90, 0x00, 0x01, 0x0C, 0x01, 0x00, 0x01, 0x06 };
  473.  
  474.     expamem_init_clear();
  475.     expamem_write (0x00, MEM_64KB | rom_card | generic);
  476.  
  477.     expamem_write (0x08, care_addr | no_shutup);
  478.  
  479.     expamem_write (0x04, 2);
  480.     expamem_write (0x10, hackers_id >> 8);
  481.     expamem_write (0x14, hackers_id & 0x0f);
  482.  
  483.     expamem_write (0x18, 0x00); /* ser.no. Byte 0 */
  484.     expamem_write (0x1c, 0x00); /* ser.no. Byte 1 */
  485.     expamem_write (0x20, 0x00); /* ser.no. Byte 2 */
  486.     expamem_write (0x24, 0x01); /* ser.no. Byte 3 */
  487.  
  488.     expamem_write (0x28, 0x10); /* Rom-Offset hi  */
  489.     expamem_write (0x2c, 0x00); /* ROM-Offset lo  */
  490.  
  491.     expamem_write (0x40, 0x00); /* Ctrl/Statusreg.*/
  492.  
  493.     /* Build a DiagArea */
  494.     memcpy(expamem + 0x1000, diagarea, sizeof diagarea);
  495.     
  496.     /* Call DiagEntry */
  497.     expamem[0x1100] = 0x4E;
  498.     expamem[0x1101] = 0xF9; /* JMP */
  499.     expamem[0x1102] = ROM_filesys_diagentry>>24;
  500.     expamem[0x1103] = ROM_filesys_diagentry>>16;
  501.     expamem[0x1104] = ROM_filesys_diagentry>>8;
  502.     expamem[0x1105] = ROM_filesys_diagentry;
  503.     
  504.     /* What comes next is a plain bootblock */
  505.     expamem[0x1106] = 0x4E;
  506.     expamem[0x1107] = 0xF9; /* JMP */
  507.     expamem[0x1108] = EXPANSION_bootcode>>24;
  508.     expamem[0x1109] = EXPANSION_bootcode>>16;
  509.     expamem[0x110A] = EXPANSION_bootcode>>8;
  510.     expamem[0x110B] = EXPANSION_bootcode;
  511.     memcpy(filesysory, expamem, 0x2000);
  512. }
  513.  
  514. /* *********************************************************
  515.  *  Dummy Entries to show that there's no card in a slot
  516.  * ********************************************************* */
  517.  
  518. void expamem_map_clear()
  519. {
  520.     fprintf(stderr, "expamem_map_clear() got called. Shouldn't happen.\n");
  521. }
  522.  
  523. void expamem_init_clear()
  524. {
  525.     memset (expamem,0xff,sizeof expamem);
  526. }
  527.